home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 September / CHIP NET Rehberi Eylül 1998.iso / ftp / iftp21 / IFTPCODE.TXT < prev    next >
Text File  |  1998-06-29  |  72KB  |  2,012 lines

  1.                           iFTP "Intelligent FTP"
  2.                                Version 2.1d
  3.                (c) copyright 1997-1998 Santronics Software Inc
  4.                      contact: support@santronics.com
  5.                           Updated: May 6, 1998
  6.  
  7.  
  8. =================================
  9. iFTP Script Language Introduction
  10. =================================
  11.  
  12. iFTP offers a powerful, yet easy to learn, enhanced FTP script language to
  13. create and run sophiscated and robust FTP automated sessions.
  14.  
  15. The #1 clear enhancement of iFTP over typical standard FTP commands is the
  16. extra script commands in iFTP to perform logical conditions and copy/move
  17. from a target to source with the ability to check for errors.
  18.  
  19. But iFTP is basically a "DOS LIKE" language with many similar capabilities
  20. that you have in DOS batch files.
  21.  
  22. iFTP views the remote ftp site as a "special drive" ftp: which you can use
  23. to distinguish which directories are being used, local DOS drive or the
  24. remote FTP "drive".
  25.  
  26. A powerful example of how you can use the iFTP script language is the
  27. ability to check for the existence of a file before proceeding with more
  28. commands, or you may wish to download multiple files and delete each file
  29. if the file download is successful, thus preventing duplicate downloads
  30. during restarts.
  31.  
  32. The iFTP script language offers similar standard FTP commands but enhanced
  33. and easier to use.  For example, the FTP get and mget commands were
  34. combined as one extended GET command; you can define you host name, userid
  35. and password all on the same OPEN command; and you can call other scripts
  36. recursively.  You can use the new COPY or MOVE commands like in DOS to
  37. perform file transfers.
  38.  
  39. iFTP scripts are flat ascii text files which you can create using a normal
  40. text editor.
  41.  
  42. Example Scripts:
  43.  
  44.   examples.zip       contains an assortment of examples using the iFTP
  45.                      script language.
  46.  
  47.   ftphub.zip         contains a batch file and script to handle the
  48.                      FTP HUB operations for Platinum Xpress Customers
  49.                      with George Peace
  50.  
  51.   ihub.zip           contains a batch file and script to handle the
  52.                      FTP HUB operations for Platinum Xpress Customers
  53.                      with John Souvestre
  54.  
  55. ============================================================
  56. Requires iFTP Files, Log file and Script locations
  57. ============================================================
  58.  
  59. In order to run iFTP, the follow files are required (bare mininum) in
  60. the same location IFTP.EXE is located:
  61.  
  62.       iftp.exe
  63.       iftp.ini        (required) INI file for iFTP
  64.       ssreg.ini       (required) Registration file
  65.       iftphelp.txt    (optional) For console mode help display
  66.       wininet.dll     (required) Microsoft's Winsock Internet Library
  67.  
  68. iFTP can be placed in a PATH directory and iFTP will automatically use
  69. the complete IFTP.EXE directory location to read the above files.
  70.  
  71. iFTP.INI will be searched first in the current directory. If not found, the
  72. iFTP.INI must be located in the iftp.exe program directory.  If not found,
  73. an error will be reported.
  74.  
  75. WININET.DLL       Microsoft' Winsock Internet Library
  76. -----------------------------------------------------
  77.  
  78. The iFTP package comes with WININET.ZIP. It contains Microsoft's Winsock
  79. internet library file WININET.DLL.  iFTP is based on this library and it
  80. is required in order to run.    If it is not found, you will get a
  81. Windows Popup message saying it was not found.
  82.  
  83. You may already have this file in your Windows System directory since it
  84. comes with NT 4.0, IE 4.0 and all the new Microsoft software. So if you
  85. already have this special WININET.DLL file, you don't need to unzip
  86. WININET.ZIP.
  87.  
  88. To quickly find out if you need it or not, simply type IFTP at the DOS
  89. BOX and if you see Windows immediately returns a pop up error message:
  90.  
  91.                   "Application Requires WININET.DLL"
  92. or
  93.                   "Missing WININET.DLL"
  94.  
  95. or something close to that effect, then you don't have on your system
  96. and you will need to unzip the WININET.ZIP file.
  97.  
  98. You can keep it WININET.DLL in the IFTP directory or you can copy it
  99. over to the Windows System directory. Either way will work.
  100.  
  101. However, if you ever do install IE 4.0 or NT 4.0 or any of the new
  102. Microsoft software, the odds are very good it will come with their
  103. current version of WININET.DLL and they might be some conflicts if IE
  104. 4.0 is using its version and iFTP is using an older version.
  105.  
  106. So our recommendation is to copy the WININET.DLL file to the Windows
  107. System Directory and make sure there isn't a second copy any where is on
  108. your system.  Delete the copy in the IFTP directory.  There will never
  109. be a problem unless there are different versions of this library loaded
  110. into memory by different applications.   By copying it into the Windows
  111. System directory, you will make sure all Win32 applications who need
  112. this library will find and use the same version of the file. If IE 4.0
  113. installs a new one, then IFTP benefits from using this new version (we
  114. hope so).
  115.  
  116. iFTP Script file Location
  117. -------------------------
  118.  
  119. When running scripts, by default iFTP looks for script (without a
  120. directory path) in this order:
  121.  
  122.      -  Current directory,
  123.      -  IFTP.EXE directory,
  124.      -  The directory defined by the AltScriptPath= key word in the
  125.         IFTP.INI [Setup] section.
  126.  
  127. If a script file has a specific directory on it, then it expects the
  128. script to be specifically at the location defined.   The above search is
  129. only done if just a file name is provided (with no directory).
  130.  
  131. By default, iFTP will use the file extension "FTP" for all scripts.
  132.  
  133. iFTP is a powerful script system. Hence it is very possible that you
  134. will or can create many generic scripts which can be reused but other
  135. scripts.  You can store these either in the IFTP directory or use the
  136. AltScriptPath= to define a directory where you place your generic
  137. scripts.
  138.  
  139. iFTP.INI Configuration File
  140. ---------------------------
  141.  
  142. iFTP will automatically read the iFTP.INI file for system configuration
  143. options and account setups.  The INI file is a typical "Windows Based"
  144. INI file, with sections, keys and values.   Read the iFTP.INI.  The file
  145. has self help for all the options.  Much information can be found in
  146. the INI which may not be found in this guide.
  147.  
  148. iFTP Log File and Script Log Files
  149. ----------------------------------
  150.  
  151. iFTP keeps a very details log of its operations in the log file
  152. with a default file name of IFTP.LOG.
  153.  
  154. By default, the log file is created in the same directory location
  155. IFTP.EXE is located.  This allows you to run IFTP from any where
  156. on the harddrive and the IFTP.LOG will always be found in the
  157. iFTP directory.
  158.  
  159. There are three ways to change the log file iFTP will use:
  160.  
  161.   Using the command line switch, /LOG
  162.  
  163.        iFTP /LOG <directory>
  164.  
  165.        This allows you to change the directory location where IFTP.LOG
  166.        will be placed.  It does not change the file name. Only the
  167.        location.
  168.  
  169.   Using the INI [SETUP] option LogFilePath=
  170.  
  171.        The keyword LogFilePath= in the INI [SETUP] session will define
  172.        the directory location where IFTP.LOG will be placed.  Once
  173.        again, this does not change the file name. Only the location.
  174.  
  175.   Using the script command LOGFILE
  176.  
  177.        LOGFILE [filename]
  178.  
  179.        The LOGFILE script command is the only way to change the log file
  180.        name.
  181.  
  182.        This command useful when you wish to create a log file for
  183.        different IFTP script operations.
  184.  
  185.        Once the script is finished, the default LOG file is
  186.        automatically reset (or the last log file defined is reset for
  187.        situations where you have scripts calling other scripts).
  188.  
  189.        Example:
  190.  
  191.        The top script call main.ftp calls two other scripts:
  192.  
  193.           MAIN.FTP
  194.  
  195.              Log Starting Main.ftp...........
  196.              Call script1.ftp
  197.              Call script2.ftp
  198.              Log Done!
  199.  
  200.        The individual sub scripts, script1 and script2 has a LOGFILE
  201.        command at the top of each script to create a specific log file
  202.        for that script.  Like so:
  203.  
  204.           SCRIPT1.FTP
  205.  
  206.              Logfile script1.log
  207.              Log Hello! We are now in Script 1
  208.  
  209.           SCRIPT2.FTP
  210.  
  211.              Logfile script2.log
  212.              Log Hello! We are now in Script 2
  213.  
  214.        Once each sub script has finished, iFTP will automatically
  215.        reset the default log before it reads the next line in the
  216.        MAIN.FTP script.
  217.  
  218.        Use the LOGFILE command when you have multiple scripts which
  219.        create big logs and you want to separate the operations into
  220.        their own separate logs for easier reading.
  221.  
  222. ==============================
  223. iFTP Script Language Reference
  224. ==============================
  225.  
  226. ---------------
  227. Language Syntax
  228. ---------------
  229.  
  230. All commands that have parameters are either required or optional.  The
  231. following delimiters are used to define the required or optional parameter.
  232.  
  233.   []       optional parameter
  234.   <>       required parameter
  235.  
  236. Comment lines in scripts all begin with the following character(s) on
  237. column 1.
  238.  
  239.   //      Double slash inline comment.
  240.   ;       Semi-colon
  241.   :       Colon
  242.  
  243. -----------------------
  244. General Script Behavior
  245. -----------------------
  246.  
  247. To run a script, use the /RUN command line option, like so:
  248.  
  249.   iFTP /RUN getmail.ftp
  250.  
  251. You can also call a script from within a script by using the CALL
  252. command.
  253.  
  254. All script files have a default file extension is FTP. So the FTP
  255. extension is not required when specifying the script file name.  If the
  256. extension is different, it must be specified.
  257.  
  258. A iFTP script is a DOS based text file.  You can NOTEPAD, the DOS editor
  259. called EDIT or your favorite text editor to create script files.
  260.  
  261. When iFTP first reads a script, it starts at the very top and reads down
  262. the text, ignoring all comment lines.
  263.  
  264. All scripts end by themselves. Once the last line is encounter, the script
  265. ends and iFTP exits.  Since iFTP offers the power of calling scripts within
  266. scripts, there are several commands to end iFTP or scripts.
  267.  
  268.   EXIT [X]    Exit current script with optional errorlevel,
  269.               Does not abort iFTP. Returns to calling script or
  270.               ends iFTP if top script.  The errorlevel, if used,
  271.               can be detected with the IF ERRORLEVEL X command.
  272.  
  273.   QUIT        Exit all scripts, ends iFTP, normal end, errorlevel 0
  274.  
  275.   ABORT       Exit all scripts, aborts iFTP with errorlevel 1
  276.  
  277.   HALT [X]    Exit all scripts, aborts iFTP with optional errorlevel X. The
  278.               default is 0.  Use ABORT when you view the error as critical
  279.               and you want an simple errorlevel.  Use Halt when you want a
  280.               different error level other than 1.
  281.  
  282. iFTP offers GOTO xxxx commands where it will jump to the script line with
  283. the line LABEL xxxx.  It can search UP or DOWN the script but only the
  284. first line in the script with the LABEL xxxx will be used. In other words,
  285. do not define two labels with the same XXXX name.
  286.  
  287. ------------------------------------------------------------
  288. DOS File Names vs Unix File Names (special remote FTP drive)
  289. ------------------------------------------------------------
  290.  
  291. In general, when using some of the iFTP script commands, such as CD, DIR,
  292. IF EXIST, COPY, MOVE etc, it is important to understand the difference
  293. between DOS file naming vs UNIX file naming to determine which determine
  294. the direction the transfer takes place, local to remote (upload) or remote
  295. to local (download).
  296.  
  297. The key difference is the usage between the forward slash (/) vs the back
  298. slash (\).
  299.  
  300. When specifying file names relative to DOS, use the back slash (\). For
  301. example:
  302.  
  303.         c:\iFTP\export\*.*
  304.  
  305. When specifying file names relative to UNIX, use the forward slash (/). For
  306. example:
  307.  
  308.         /inbin/*.*
  309.  
  310. or you can use the special remote drive letter, ftp:
  311.  
  312.        ftp:/inbin/*.*
  313.  
  314. Although, iFTP will allow you to use DOS back slashes for UNIX directories
  315. and file names in many of the remote file I/O commands, it helps if you
  316. understood the distinction.
  317.  
  318. Many of the new iFTP commands rely on this distinction of back slash (/)
  319. versus forward slash (/) and using the ftp: drive letter to determine which
  320. direction is the file transfer or location of the file.
  321.  
  322. In this document, a file name or directory having unix back slashes, refers
  323. to a file or directory at the remote site. Similarily, a file name or
  324. directory having DOS back slashes, refers to a file or directory at the
  325. local site.
  326.  
  327. Here are some examples:
  328.  
  329.     // download from remote /*.* to local \import directory
  330.  
  331.        copy /*.* \import
  332.  
  333.     // upload all files in \export to remote /import directory
  334.  
  335.        copy \export\*.* /import
  336.  
  337. As you can see, iFTP uses the same command, but uses the / or \
  338. to determine the direction.
  339.  
  340. New with Version 2.0!
  341.  
  342. When no relative paths are defined, PX will assume the local drive. However,
  343. you can now switch to the remote drive using the FTP: command to make all
  344. the FILE I/O commands relative to the remote drive.  For example:
  345.  
  346.        open ftpsite
  347.  
  348.     // show dos directory
  349.  
  350.        dir
  351.  
  352.     // show remote directory
  353.  
  354.        dir /
  355.  
  356.     // show remote directory
  357.  
  358.        FTP:
  359.        dir
  360.  
  361. In other words, the FTP: command switches the relative drive to the
  362. remote site to make it easier to use the DIR and CD commands.
  363.  
  364. This is very useful when using iFTP in console mode (iFTP /con).
  365.  
  366. ===========================================
  367. iFTP Asynchronous vs Synchronous Operations
  368. ===========================================
  369.  
  370. When performing FTP operations under Win32, it can done in two modes:
  371.  
  372.      - Asynchronous or non-blocking
  373.      - Synchronous or blocking
  374.  
  375. Blocking basically means that iFTP makes a request and waits for a
  376. response.  In a non-blocking environment, iFTP will make a request and do
  377. something else while waiting for the response.
  378.  
  379. In a non-blocking state, more information is obtained.  It has more
  380. overhead and thus can be slightly slower (probably not noticable).
  381.  
  382. This concerns iFTP for only two things:
  383.  
  384.      - For Debugging, to watch whats going on at various states.
  385.      - To offer a progress indicator during file transfers.
  386.  
  387. So after its all said and done, the only reason why you would want to
  388. use Asynchronous operations is to turn on the progress indicator.
  389. Otherwise, when you issue a GET or PUT, iFTP will not log or say
  390. anything until the request is complete.  Under normal and working script
  391. operations, this would be the best mode of operations.
  392.  
  393. Turning on Asynchronous operations
  394.  
  395. iFTP opens the windows internet sockets in async or sync mode based on
  396. the initial Socket= value in the iFTP.INI [Setup] session.  If 1, the
  397. socket will be open up in Asynchronous mode, thus making all FTP
  398. commands available for non-blocking operations.
  399.  
  400. However, even if the socket is open in async, you still have the power
  401. to turn on various file transfer async modes.
  402.  
  403. You can also use the script command ASYNC to disable or enable
  404. asynchronous operations.
  405.  
  406.   ASYNC [ON|OFF|CONNECT|GET|PUT|DIR]
  407.  
  408.      The Async command toggles Asynchronous operations globally or specific
  409.      parts of a network session.  There are four parts iFTP can perform
  410.      Asynchronous communications:
  411.  
  412.             CONNECT       when connection to a ftp host/server
  413.             GET           when downloading files
  414.             PUT           when uploading files
  415.             DIR           when issues a directory command
  416.  
  417.      If ON to globally turn on async communications for all four processes,
  418.      use OFF to turn them off.
  419.  
  420. Since one of the main reasons for asynchronous operations was to allow
  421. for a progress indication, the PROGRESS command is available to
  422. automatically enable or disable asynchronous operations during the
  423. GET or PUT operations.
  424.  
  425.   PROGRESS [ON:OFF]
  426.  
  427.      The PROGRESS Command will show a download/upload transfer indicator to
  428.      show how many bytes were transmitted.
  429.  
  430.      Examples:
  431.  
  432.         Async On                  // open socket in async mode
  433.         Open ftpsite              // connect to ftpsite
  434.         Progress On               // turn on progress indicator
  435.         Get /*.* \iFTP\import     // download files
  436.  
  437.  
  438. ==========================
  439. iFTP Download File Caching
  440. ==========================
  441.  
  442. iFTP offers built-in file caching when downloading files.  What
  443. this means is that it is possible to download a file and try it
  444. again, and if the file is already in the cache, iFTP will not
  445. download it again.
  446.  
  447. You can turn this behavior on or off with the iFTP.INI [Setup]
  448. session key UseCache=1/0
  449.  
  450. In addition, you can use the CACHE script command.
  451.  
  452.   CACHE ON|OFF
  453.  
  454.      New CACHE script command allows disabling/enabling of download
  455.      caching.  If off (default) all downloads are not saved on local drive
  456.      cache.
  457.  
  458. The main reason why you may wish to turn it off (default) is to conserve
  459. disk space.  Cache is only required if you want iFTP to remember your
  460. downloads. Re-attempts of downloading the same file will be checked in
  461. the cache to see if the file is there.
  462.  
  463. NOTE: The cache feature is a feature of the Microsoft WININET.DLL
  464. library.   iFTP simply turns it on or off.  iFTP itself does not
  465. have a cache system.
  466.  
  467. =======================================================================
  468. iFTP Set Variables, Internal, Environment Strings and Script Parameters
  469. =======================================================================
  470.  
  471. With iFTP scripts, you can define and use variables defined 4 different
  472. ways:
  473.  
  474.   - User Defined Set variables
  475.   - Internal Variables always available
  476.   - Environment Strings
  477.   - Script parametners
  478.  
  479. Variables are items that are defined and can used in scripts in a generic
  480. fashion.  This featured concept is similar to DOS with its set environment
  481. strings and batch file parameters. They add tremendous programming power to
  482. your scripts by allowing you create scripts that are re-usable by others or
  483. yourself, and more maintainable.
  484.  
  485. User Defined Set Variables
  486. --------------------------
  487.  
  488. Within iFTP scripts you can define variables called set variables or keys.
  489. Upto 30 set keys can be defined using the SET script command.
  490.  
  491. To define a key, type
  492.  
  493.        SET key=value
  494.  
  495.        example:
  496.  
  497.        set file=whatever.zip
  498.  
  499. To access the key, use the % character to surround the key, like so %key%.
  500. iFTP will substitute the value for the %key% when it is encountered in a
  501. script line.
  502.  
  503.        example #1:
  504.  
  505.        Write Ready to download file = %file%
  506.        Get %file%
  507.  
  508.        example #2:
  509.  
  510.        set url1=http://www.santronics.com/iftp21.zip
  511.        set url2=http://www.santronics.com/pxw20td.exe
  512.  
  513.        webget %url1%
  514.        webget %url2%
  515.  
  516. To erase a key, type
  517.  
  518.        SET key=
  519.  
  520. To erase all keys, type:
  521.  
  522.        SETCLR
  523.  
  524. To show all they keys or just one key, type:
  525.  
  526.        SET
  527.        SET key
  528.  
  529. Internal Variables
  530. ------------------
  531.  
  532. iFTP automatically provide some global variables to be used within your
  533. scripts besides the ones you can define.  These global are always
  534. available to you:
  535.  
  536.      %input%         Defined when the INPUT command is used
  537.      %rashost%       Currently connected RAS Host Entry Name
  538.      %rasip%         Currently connected assigned RAS IP Address
  539.      %ftphost%       Currently connected FTP host
  540.      %errorlevel%    Current ErrorLevel
  541.      %lasterror%     Last Error
  542.      %lastkey%       Last Key pressed (Ascii Code 0-255)
  543.      %lastchar%      Last Char pressed
  544.      %script%        Current Script Running
  545.      %date%          Current date in MM/DD/YYYY format, i.e, 06/28/1998
  546.      %time%          Current time in HH:MM:SS format, i.e, 18:24:00
  547.      %day%           Current day (abbreviation), i.e, Mon, Wed, Sat..
  548.  
  549.      Example #1:
  550.  
  551.      Dial MyISP
  552.      if not success then abort
  553.      Log Connected to ISP! Assigned IP address is %rasip%
  554.  
  555.      Example #2:
  556.  
  557.      //
  558.      // Dial ISP, and store IP address at your web site.
  559.      // This allows other people to use a get the file
  560.      // to see what your currently IP addrss is. This
  561.      // useful for non-dedicated connections where you
  562.      // might want to publish your 1 or 2 hour internet
  563.      // connection
  564.      //
  565.  
  566.      Dial MyISP
  567.      if not success then abort
  568.      Log Connected to ISP! Assigned IP address is %rasip%
  569.      open ftp.mywebsite.com userid password
  570.      if not success then abort
  571.      write ftp:/assigned.ip %rasip%
  572.      close
  573.  
  574.      Another iftp user can use this script to get the
  575.      ip address.
  576.  
  577.      //
  578.      // Get IP address and put it in set variable serverip
  579.      //
  580.  
  581.      if exist assigned.ip then erase assigned.ip
  582.      Webget http:://www.mywebsite.com/assigned.ip
  583.      if not exist assigned.ip then abort "Service not alive"
  584.      readfile assigned.ip serverip
  585.      Log Server is available at IP address = %serverip%
  586.  
  587. As you see, all kinds of iFTP programming power is available to you!
  588.  
  589. Environment Strings
  590. -------------------
  591.  
  592. iFTP also supports the system environment strings within your scripts. For
  593. example:
  594.  
  595.     copy ftp:/usenet/*.*  %import%
  596.  
  597. The import environment string can be defined in a batch file and when you
  598. call the script, iFTP will translate the %import% environment string.
  599.  
  600.     Example:
  601.  
  602.     -- DoFTP.BAT ---
  603.  
  604.       @echo off
  605.       set import=iFTP\import
  606.       iFTP /run getfiles.ftp
  607.  
  608.     -- Getfiles.ftp --
  609.  
  610.       Dial FtpSite
  611.       if not success then abort
  612.       Open FtpSite
  613.       if not success then abort
  614.       copy ftp:/usenet/*.*  %import%
  615.       Hangup
  616.  
  617.  
  618. iFTP Script Parameters
  619. ----------------------
  620.  
  621. Like batch files, you can pass up to 9 paramters to scripts. To access
  622. the script parameters, use %1, %2 ... thru %9.   Do not use %1%.
  623.  
  624. You can pass them via the iFTP command line:
  625.  
  626.     iFTP /run script [param1, param2...param9]
  627.  
  628. or when calling a script with the CALL command:
  629.  
  630.     CALL script [param1, param2...param9]
  631.  
  632. This adds tremendous programming power to your scripts making it possible
  633. to develop generic scripts with variables defined script parameters.
  634.  
  635.     Example:
  636.  
  637.     // File: PlayHalt.ftp
  638.     // script to play wav file and halt
  639.  
  640.        playwav %1
  641.        halt 1
  642.  
  643.     Now you can call this script like so:
  644.  
  645.        open ftpsite
  646.        if not success then call playhalt badconnect.wav
  647.  
  648. Comparing or Checking for Variables
  649. -----------------------------------
  650.  
  651. Whether you the set variables, internal environment strings or parameters,
  652. there are times where you have to check to make sure they exist.  For
  653. this you use the IF condition EQUAL:
  654.  
  655.     IF EQUAL <string1> <string2> THEN ......
  656.  
  657. For example:
  658.  
  659.     if not equal "%ftpin%" "" goto ok
  660.     Log Environment string FTPIN is not defined
  661.     Log Please define it before calling this script
  662.     Abort
  663.  
  664.     LABEL OK
  665.  
  666. Use the double quotes around the string to make sure iFTP can read the two
  667. strings.  If you don't use the "" then syntax would not be correct.
  668.  
  669. The string comparison is not case sensitive.
  670.  
  671. ===============================================
  672. Remote Access Service, Dial up Networking (DUN)
  673. ===============================================
  674.  
  675. iFTP has a built-in Dial Up Networking (DUN) dialer.  It works for
  676. Windows 95, Windows 98, Windows NT.  Most people know it as RAS under
  677. Windows NT.
  678.  
  679.     +-[ NOTE ]-----------------------------------------------------+
  680.     | As of version 2.1C, you no longer need RAS installed on the  |
  681.     | computer to use iFTP.   This is useful for pure LAN/WAN FTP  |
  682.     | server operations where RAS is not installed and no dialing  |
  683.     | is required from a workstation.                              |
  684.     +--------------------------------------------------------------+
  685.  
  686. When iFTP first starts, it will always check to see if there is a current
  687. connection. This allows you to use iFTP with the current connection.
  688.  
  689. If you attempt to dial when there is already a connection, iFTP will skip
  690. the dial command.  You must hangup to dial again.
  691.  
  692. There is two ways to dial with iFTP:
  693.  
  694.      - Using the iFTP /DIAL switch option
  695.      - Using the iFTP DIAL script command
  696.  
  697. Using the command line switch /DIAL:
  698.  
  699.   Syntax:  iFTP /DIAL [entry] [userid] [password]
  700.  
  701.   The entry name must match one in the iFTP.INI file or in the DUN Phone
  702.   Book in your system.  If no entry name is provided, iFTP will use the
  703.   default [PPP] account stored in the iFTP.INI file.
  704.  
  705.   The userid and password parameters are optional and can be stored in
  706.   the iFTP.ini file.  Under NT 3.51, it can stored in the DUN phone
  707.   book. Only under Win95 or NT 4.0, is it necessary to store it in the
  708.   iFTP.INI file.
  709.  
  710.   It is important to note that when using the /DIAL command, iFTP will
  711.   not hangup. You must hangup the line yourself using a subseqeunt iFTP
  712.   /HANGUP command.
  713.  
  714.   Examples:
  715.  
  716.   1) iFTP /dial MyISP iFTP /run script iFTP /hangup
  717.  
  718.   2) iFTP /dial /run script /hangup
  719.  
  720.   3) iFTP /dial MySecondPPPaccount
  721.  
  722. Using the DIAL Script command:
  723.  
  724.   DIAL [entry] [username [password]]
  725.  
  726.      The DIAL command will dial the entry name defined. The entry record
  727.      must be created on your system.  Under Win95, the entry is created
  728.      with your Dialup Network Manager.  Under NT, it is created with the
  729.      Remote Access Server Manager.
  730.  
  731.      Under Win95 and WinNT 4.0, the username and password is required.
  732.  
  733.      Under WinNT 3.51, the username and password is not required.
  734.  
  735.      If no parameters are provided, the defaults are obtained from the
  736.      iFTP.INI ([PPP] section).
  737.  
  738.   HANGUP
  739.  
  740.      Hangup the current RAS connection (carrier is drop).  This is command
  741.      is not necessary for a script.  iFTP will automatically drop the line
  742.      unless the DIALOPTIONS option /KEEP is used.
  743.  
  744.   DIALOPTIONS [/STATUS] [/KEEP] [/TIMEOUT <seconds>] [/REDIAL <amt>]
  745.  
  746.      The DIALOPTIONS command defines how the RAS dialing behaves.
  747.  
  748.      /STATUS
  749.  
  750.      This will show the dialing status information while it is dialing.
  751.      This information can be very verbose. To minimize your iFTP.LOG
  752.      file, do not use this option.  Only use it when you need to
  753.      investigate the dialing status to your provider.
  754.  
  755.      /KEEP
  756.  
  757.      By default, iFTP will automatically hangup the RAS connection when it
  758.      exits.  You can also hangup using the HANGUP command in your scripts.
  759.  
  760.      However, if you want to write a simple script to dial a system and
  761.      keep the RAS connection alive, then option /KEEP tells iFTP to not
  762.      hangup when it exits. This is useful when you want to use iFTP to dial
  763.      up a system and keep the line active for other applications to use.
  764.  
  765.      /TIMEOUT <secs>
  766.  
  767.      The timeout option defines how long the dialer will wait before
  768.      exiting with a time out ever.  By default, the time out is 90 seconds.
  769.      If you want to use Windows RAS default timeout value, then use 0 for
  770.      the seconds.  This will set an infinite wait value and will allow
  771.      Windows to inform iFTP when it is complete.  Normally, this is about
  772.      3-5 minutes under Win95/NT.
  773.  
  774.      /REDIAL <amt>
  775.  
  776.      The redial option is not implemented yet.
  777.  
  778.   Examples:
  779.  
  780.      ; Dial the default PPP account, show dial status, timeout in
  781.      ; 60 seconds if fails to connect
  782.  
  783.        DialOptions /Status /Timeout 60
  784.        Dial
  785.        if not success then abort
  786.        ...
  787.        hangup
  788.  
  789. ===========================
  790. Session/Connection Commands
  791. ===========================
  792.  
  793.   OPEN [host or alias] [userid] [password]
  794.  
  795.      Opens a session with the remote ftp host site.  If no parameters
  796.      are provided, defaults are taken from iFTP.INI file.
  797.  
  798.      It is a good idea to use the IF condition to determine the success
  799.      of the open.  For example:
  800.  
  801.            Open ftp.microsoft anonymous hector@santronics.com
  802.            If not success then abort
  803.  
  804.      If a session is already open, when this command is issued, the
  805.      current session will be automaticalled closed.
  806.  
  807.      iFTP will always close a session (and the socket) when it exits back
  808.      to the system.
  809.  
  810.      You can define an alias in the iFTP.INI file to get the parameters
  811.      of the connect and login.   For example:
  812.  
  813.             OPEN WebSite
  814.  
  815.      iFTP will search for the section [WebSite] in the inifile and read
  816.      the host, userid and password key values.
  817.  
  818.      Using aliases makes it easier to design generic scripts to
  819.      distribute to others without putting your userid and password in
  820.      the scripts.
  821.  
  822.      If no alias is found, iFTP will assume the name to be DNS host name
  823.      and attempt to resolve it.
  824.  
  825.      You can also use iFTP within a LAN where there is a FTP server.
  826.      Simply type in the FTP server machine name and it will be found.
  827.  
  828.      You can also type in IP addresses as well.
  829.  
  830.   CLOSE
  831.  
  832.      Closes current session.
  833.  
  834.   QUIT
  835.  
  836.      Closes current session and exits script.
  837.  
  838.   When scripts are finished, iFTP will automatically close the session
  839.   and close the socket.  So CLOSE and QUIT are not necessary.  CLOSE
  840.   is only useful if you are OPENING and CLOSING multiple sessions in
  841.   the same script.
  842.  
  843. ===============================
  844. Directory and File I/O Commands
  845. ===============================
  846.  
  847.   iFTP was designed to offer a rich set of FILE I/O commands similar
  848.   to that of DOS.
  849.  
  850.   All of the following commands work with either the local drive or the
  851.   remote drive.  To work with the remote directory, use the special FTP
  852.   drive letter (ftp:) or the respective / or \ characters to distinquish
  853.   direction.
  854.  
  855.   DIR [file spec]
  856.   LS [file spec]
  857.  
  858.      Display files spec.  LS displays the files in wide format similar
  859.      to the unix format.
  860.  
  861.      Examples:
  862.  
  863.          Dir c:\bin\*.*         Display files in c:\bin
  864.          Dir ftp:/bin\*.*       Display files in remote \bin directory.
  865.  
  866.   CD [directory]
  867.  
  868.      Change directory.  If no directory is provided, the LOCAL current
  869.      directory is displayed.  To display the REMOTE current directory use
  870.      ftp:.   Examples:
  871.  
  872.           cd                    display local current directory
  873.           cd ftp:               display remote current directory
  874.           cd ftp:/              return to remote root directory
  875.           cd ftp:/inbin         change to the remote /inbin directory
  876.  
  877.  
  878.   MD <directory>
  879.   MKDIR <directory>
  880.  
  881.      Make a new directory. Use the ftp: drive letters to indicate a remote
  882.      directory. Examples:
  883.  
  884.           md \new               create new local \new directory
  885.           md ftp:/new           create new remote /new directory
  886.  
  887.   RD <remote directory>
  888.   RMDIR <remote directory>
  889.  
  890.      Remote directory. Use the ftp: drive letters to indicate a remote
  891.      directory. Examples:
  892.  
  893.           rd \new               remove local \new directory
  894.           rd ftp:/new           remove remote /new directory
  895.  
  896.   ERASE <remote filespec>
  897.   DEL <remote filespec>
  898.  
  899.      Deletes one or more file(s). Use the ftp: drive letters to indicate
  900.      remote files. Examples:
  901.  
  902.           erase \import\*.zip      delete files in local import directory
  903.           erase ftp:/import/*.zip  delete files in remote import directory
  904.  
  905.   BINARY [ON:OFF]
  906.  
  907.      For file transfers, you may define how file transmissions are to be
  908.      uploaded or downloaded using any of the file transfer commands.
  909.  
  910.      BINARY is enabled (ON) by default.
  911.  
  912.      If BINARY is disabled (OFF), then all files will have the linefeed
  913.      character converted to carriage return/linefeed pairs during
  914.      downloads and vice versa during uploads.  This is considered a text
  915.      mode transmission.
  916.  
  917.      Use Binary OFF when you are absolutely sure you are transferring
  918.      text files only, such as *.txt or html files.  Make sure binary
  919.      mode is disabled when transmitted binary files such as ZIP files,
  920.      Fidonet mail bundles or packets, etc.
  921.  
  922.   GET <remote filespec>  [local storage path]  [/KILL]
  923.  
  924.      Downloads remote files.  If operation local storage path is defined,
  925.      this is where the files will be locally stored.   If the /KILL option
  926.      is defined, the remote file is deleted after a successful download.
  927.  
  928.      examples:
  929.  
  930.         ; download remote files into current directory, kill remote
  931.         ; file after each successful download
  932.  
  933.         get /export/*.zip /kill
  934.  
  935.         ; download remote files into storage directory
  936.  
  937.         get /export/*.zip \import
  938.  
  939.      see COPY, MOVE command
  940.  
  941.   PUT <Local filespec> [remote storage path]  [/KILL]
  942.  
  943.      Uploads local files to the remote site.  If operation remote storage
  944.      path is defined, this is where the files will be remotely stored.   If
  945.      the /KILL option is defined, the local file is deleted after a
  946.      successful upload.
  947.  
  948.      examples:
  949.  
  950.         ; Upload local files in current directory, kill local file
  951.         ; after each successful upload
  952.  
  953.         put c:\pxw\export\*.* /kill
  954.  
  955.         ; Upload local files into remote directory.
  956.  
  957.         put c:\pxw\export\*.* /import /kill
  958.  
  959.      see COPY, MOVE command
  960.  
  961.   COPY <sourceFiles> <targetpath>
  962.   MOVE <sourceFiles> <targetpath>
  963.  
  964.      Copies or moves one or more files from the source to the target.
  965.      These commands offer you the DOS like similarities of the DOS copy
  966.      and move commands.
  967.  
  968.      The move command is basically like the PUT -KILL options where it
  969.      will copy the file and then delete it.   This is useful in
  970.      situations where they might be a connection drop.  On restart, only
  971.      the remaining files will be uploaded.
  972.  
  973.      examples:
  974.  
  975.         ; Copy local files to remote system
  976.  
  977.         copy \iFTP\export\*.* /import
  978.  
  979.         ; Move local files to remote system
  980.  
  981.         move \iFTP\export\*.* /import
  982.  
  983.   RENAME <OldFileName> <NewFileName>
  984.  
  985.      The RENAME command will remame the old file name to new file name.
  986.  
  987.      Both files must be on the same machine.
  988.  
  989.      When using DOS files, the new file name can be on a different
  990.      directory or dos drive.  So effectively, you can use this as a move
  991.      operation with the ability to rename the file at the same time. For
  992.      example:
  993.  
  994.             rename c:\file1.txt d:\backup\file3.txt
  995.  
  996.      When working with remote files on a FTP server, there might be some
  997.      FTP servers who may or not honor the concept of moving a file when
  998.      using the rename command.  Be aware that some FTP servers, may not
  999.      allow operation. For example:
  1000.  
  1001.              rename /file1.txt /textfiles/file20.txt
  1002.  
  1003.      The above command may work for FTP some servers.
  1004.  
  1005.   UPDATE <RemoteFiles> [DosPath] [-kill]
  1006.  
  1007.      The Update command allows you to download Remote files which are
  1008.      newer than the local files with the same name.  If the local file
  1009.      does not exist, the files are copied.    The UPDATE command works
  1010.      by using the remote file date and compares it with the local file
  1011.      date.  So even of the option INI UseSaveDate is disabled, Update
  1012.      can be used to copy updated ftp files to the local drive.
  1013.  
  1014.      The -kill option works like the move.  Updates remote files will
  1015.      be downloaded and then deleted from the remote site.
  1016.  
  1017.      NOTE:  The Update command only works in one direction (Remote
  1018.      to Local).  It does not work updated local files to the remote
  1019.      site.  Consider using the XPUT command archive option.
  1020.  
  1021.      examples:
  1022.  
  1023.         ; Copy only new files from remote site
  1024.  
  1025.         update /reports/*.* \reports
  1026.  
  1027.   XPUT <LocalFiles> [Storage] [-A -M -E -T]
  1028.  
  1029.      XPUT is a very powerful command.  It is similar to the DOS xcopy
  1030.      command but for putting (uploading) files to the remote site.
  1031.  
  1032.      Using XPUT without the options makes it work like the normal
  1033.      PUT command.
  1034.  
  1035.      But when used with options, you can perform massive copies including
  1036.      subdirectories from the local drive to the remote site.
  1037.  
  1038.      -E        Copy files including subdirectories. New directories on
  1039.                the remove site will be checked and/or created.
  1040.  
  1041.      -A        Copy only archive files to the remote site.  Archive
  1042.                files are local files which have the archive bit.  The
  1043.                archive bit is always set by the PC file system when
  1044.                the file is first created or modified.
  1045.  
  1046.      -M        Same as -A but will remove the archive attribute of
  1047.                the file after the upload is finished.  This is useful
  1048.                for backups or for mirroring a directories.  The next
  1049.                the the XPUT -M command is used, it will only copy
  1050.                the new files.
  1051.  
  1052.      -T        This option is used for TESTING purposes. It gives you
  1053.                the ability to see what XPUT will do when copying files
  1054.                without actually performing the copy.  Use -T to see
  1055.                that it will do what you want first.
  1056.  
  1057.      Examples:
  1058.  
  1059.         ; Copy the entire local web directory and subdirectories
  1060.         ; Run in test mode to see the results first.
  1061.  
  1062.           xput j:\website\*.* ftp:/ -e -m -t
  1063.  
  1064.   WRITEFILE <file> [string]
  1065.  
  1066.      This command opens a file and writes the optional string to it, then
  1067.      closes the file.    This command is useful for creating a semaphore
  1068.      file like it is done in the PAONLINE.FTP example.
  1069.  
  1070.   READFILE <filename> <var> [line#]
  1071.  
  1072.      Read a line in the file and set the result into the variable "var".
  1073.      The variable can then be used as a set variable.
  1074.  
  1075. ================
  1076. Generic Commands
  1077. ================
  1078.  
  1079.   STATUS
  1080.  
  1081.      Show iFTP Status Information.  This command will display the
  1082.      current state of affairs with internal information such as RAS or
  1083.      IP connections, asynchronous or synchronous states or debugging
  1084.      states and so on.   It is useful to use during console mode when
  1085.      you are testing your scripts.
  1086.  
  1087.      Here is an example output:
  1088.  
  1089.      * iFTP Status Information:
  1090.      * RAS Connection   : Vincent
  1091.      * RAS IP Address   : 209.4.200.151
  1092.      * RAS Connect Time : 1232 secs
  1093.      * FTP Connection   : <no connection>
  1094.      * Socket Mode      : Sync      Dial Mode     : Sync
  1095.      * Connect Mode     : Sync      Search Mode   : Sync
  1096.      * Download Mode    : Sync      Upload Mode   : Sync
  1097.      * Save File Date   : OFF       Transfer Type : Binary
  1098.      * Download Cache   : OFF       Show Progress : ON
  1099.      * Server Debug     : OFF       Async Debug   : OFF
  1100.      * Script Debug     : OFF       Verbose Debug : OFF
  1101.      * Show I/O Errors  : OFF       Error Level   : 0
  1102.      * Last Error #     : 0         System Error  : 0
  1103.      * Last Error Msg   : The operation completed successfully
  1104.  
  1105.   DEBUG [ON|OFF|LOG|ASYNC|SCRIPT]
  1106.  
  1107.      Turns on/off the debugging of scripts, verbosity of the log file
  1108.      and the result of asynchronous communications.  This is only
  1109.      useful under debugging situations.
  1110.  
  1111.   BEEP
  1112.  
  1113.      Sound the speaker
  1114.  
  1115.   PLAYWAV <file>
  1116.  
  1117.      This allows the playing of wav files (Sounds card required).  Useful
  1118.      for signaling certain events.
  1119.  
  1120.      Example:
  1121.  
  1122.           open ftpsite
  1123.           if not success then playwav BadConnect.Wav
  1124.  
  1125.      See the provided SOUND.ZIP for example wav files that can be
  1126.      used with your scripts.
  1127.  
  1128.   POPUPMSG <string>
  1129.  
  1130.      Display a POPUP Messages. It is a simple OK buttom message box.
  1131.      Useful to pause the  script for certain events.
  1132.  
  1133.   EXEC <application>
  1134.   DOS  <application>
  1135.  
  1136.      This command will start the application specified.  DOS does the
  1137.      same thing but will use the DOS command interpreter to run the
  1138.      application.  Use DOS when you want to use DOS commands within
  1139.      scripts.
  1140.  
  1141.      Examples:
  1142.  
  1143.         ; Run dos command
  1144.  
  1145.           dos ping ftp2.paonline.com
  1146.  
  1147.   CALL <scriptfile>
  1148.  
  1149.      Runs another script file and return the calling script.  This is
  1150.      useful for running multiple scripts during the same iFTP execution.
  1151.  
  1152.      Example:
  1153.  
  1154.      Suppose you have two independent scripts; script1.ftp, script2.ftp,
  1155.      you can do this:
  1156.  
  1157.                iFTP /RUN script1.ftp
  1158.                iFTP /RUN script2.ftp
  1159.  
  1160.      or you can create another script called runall.ftp which has the
  1161.      following lines:
  1162.  
  1163.                call script1.ftp
  1164.                call script2.ftp
  1165.  
  1166.      and run iFTP once by doing the following:
  1167.  
  1168.                iFTP /RUN runall.ftp
  1169.  
  1170.   ABORT [string]
  1171.  
  1172.      Aborts the current script and exits iFTP.  If optional string is
  1173.      provided, it is written to the log and screen.   A process error level
  1174.      of 1 is set.  This process error level can be detected by a batch
  1175.      file.
  1176.  
  1177.   HALT [errorlevel]
  1178.  
  1179.      Similar to the ABORT command, but allowing you to define an process
  1180.      error level. This process error level can be detected by a batch file.
  1181.      See example #6 (exam6.ftp)
  1182.  
  1183.   EXIT [errorlevel]
  1184.  
  1185.      Exits current script, exits iFTP or calling script with optional
  1186.      errorlevel.  EXIT simply exits the current script and returns to
  1187.      the calling script.  If its the top script, then iFTP ends.
  1188.  
  1189.      With the optional errorlevel, you can use this to test scripts
  1190.      errorlevels, for example:
  1191.  
  1192.              main script:
  1193.  
  1194.                    call subscript ftpsite *.*
  1195.                    if errorlevel 1 then Abort "Bad Connection!"
  1196.                    if errorlevel 2 then Abort "Bad Download!"
  1197.                    Log Success!
  1198.                    Exit 0
  1199.  
  1200.              subscript:
  1201.  
  1202.                    open %1
  1203.                    if not success then exit 1
  1204.  
  1205.                    get ftp:/%2
  1206.                    if not success then exit 2
  1207.  
  1208.                    Exit 0
  1209.  
  1210.   ERRORLEVEL [errorlevel]
  1211.  
  1212.      Change the current error level as remembered by IFTP.
  1213.  
  1214.   ERRORQUIET [ON|OFF]
  1215.  
  1216.      Enable or disable the internal I/O error logging.  By default,
  1217.      iFTP scripts commands will be quiet, like GET /*.*.  This
  1218.      allows you more control with your scripts to log the results
  1219.      yourself.   See the IF ERRORQUIET discussion below.
  1220.  
  1221.   GOTO <label>
  1222.  
  1223.      Jump to the label provided.  See LABEL command
  1224.  
  1225.   LABEL <label>
  1226.  
  1227.      Defines a label in the script file.
  1228.  
  1229.      Example:
  1230.  
  1231.         open ftp.microsoft anonymous hector@santronics.com
  1232.         if not success then goto error
  1233.         .
  1234.         .
  1235.         LABEL error
  1236.  
  1237.   IF [NOT] <condition> [THEN] <commands>
  1238.  
  1239.   or
  1240.  
  1241.   IF [NOT] <condition> [THEN] BEGIN
  1242.   [ELSE]
  1243.   ENDIF
  1244.  
  1245.      The IF command sets up a conditional check. If true, the rest of
  1246.      the line is read. If false, the next line is read.
  1247.  
  1248.      The optional NOT word provides a negative conditional check.
  1249.  
  1250.      The THEN word is not necessary, but it makes the script easier to
  1251.      read.  In additional, you can use the word AND to add more
  1252.      conditions. for example:
  1253.  
  1254.         example:
  1255.  
  1256.         if not success and errorno 12007 then write Open Fail! Check PPP!
  1257.  
  1258.      You may also use the structured IF BEGIN ELSE ENDIF block.  If you
  1259.      want to use a block, then the IF line must have the BEGIN word
  1260.      and you must have a matching ENDIF command.  The ELSE is optional
  1261.      which will executure the FALSE portion of the condition.
  1262.  
  1263.      The following conditions are supported:
  1264.  
  1265.      ERRORNO <errorno>
  1266.  
  1267.         Checks/Compares the errorno with the last error number defined
  1268.         by the previous command.
  1269.  
  1270.      ERRORLEVEL <errorlevel>
  1271.  
  1272.         Checks/Compares the errorlevel with the current errorlevel set
  1273.         in the scripts.
  1274.  
  1275.      SUCCESS
  1276.  
  1277.         Compares the success operation of the previous command.
  1278.  
  1279.      CARRIER
  1280.  
  1281.         Carrier is true if the PORT is active.
  1282.  
  1283.      ERRORQUIET
  1284.  
  1285.         ERRORQUIET is true by default when running scripts. This
  1286.         prevents I/O commands from logging errors thus given you more
  1287.         error logging control via scripts.  By using a IF ERRORQUIET
  1288.         check, you can conditional write errors to the log based if it
  1289.         hasn't been written to the log yet by the internal error logger.
  1290.  
  1291.         In short, if you want to minimize scripts by not using
  1292.         commands such as:
  1293.  
  1294.                   get /*.*
  1295.                   if not success then writeerror
  1296.  
  1297.         Then set ErrorQuiet to NO or FALSE, and the GET /*.* will
  1298.         write the error to the log and screen for you.
  1299.  
  1300.         Example:
  1301.  
  1302.            // Take control of error logging by making the I/O
  1303.            // command quiet.  By turning off the internal
  1304.            // error logger, if you want to see errors written
  1305.            // to the screen and the log file, then you have
  1306.            // to use the WriteError command yourself.
  1307.  
  1308.                   ErrorQuiet On
  1309.                   get /*.*
  1310.                   if not success then writeerror
  1311.  
  1312.            // Allow the internal I/O error logger to write
  1313.            // errors to the screen and log.  This avoids
  1314.            // the duplicate writing yourself.
  1315.  
  1316.                   ErrorQuiet Off
  1317.                   get /*.*
  1318.                   if not success then abort
  1319.  
  1320.            // Make the error logging conditional by using
  1321.            // IF ERRORQUIET.  This allows you to turn the
  1322.            // error logging on and off at the top of your
  1323.            // scripts and still maintain a generic script
  1324.            // This is good for debugging situations where
  1325.            // you want to catch all possible errors.
  1326.  
  1327.                   ErrorQuiet Off
  1328.                   get /*.*
  1329.                   if not success then begin
  1330.                      if ErrorQuiet then WriteError
  1331.                      Abort
  1332.                   endif
  1333.  
  1334.      SESSION
  1335.  
  1336.         Session is true if the current connection is active. The OPEN
  1337.         command establishes a session.
  1338.  
  1339.      EXIST <filespec>
  1340.  
  1341.         Checks if file(s) exist
  1342.  
  1343.         example:
  1344.  
  1345.         ; Download remote outbin files, if any, into the current
  1346.         ; directory
  1347.  
  1348.         If Exist ftp:/outbin/*.* then Get /outbin/*.* /kill
  1349.  
  1350.      EQUAL <string1> <string2>
  1351.  
  1352.         Compares two strings. Useful to change set variables and
  1353.         environment strings.
  1354.  
  1355.         example:
  1356.  
  1357.         ; Check to make sure the environment string FTPOUT is
  1358.         ; defined before continuing.
  1359.  
  1360.         If not equal "%ftpout%" "" then Abort SET FTPOUT not defined
  1361.  
  1362.      TIMERANGE <begintime> <endtime>
  1363.  
  1364.         Compares the current time within the begin and end time.  This
  1365.         is useful when you want want to run a part of a script during
  1366.         a certain time of the day.
  1367.  
  1368.         example:
  1369.  
  1370.         ; Run this part of the script when the time is between 5pm
  1371.         ; and 7pm on Wednesdays only!
  1372.  
  1373.         If EQUAL "%day%" "Wed" then begin
  1374.            If TIMERANGE 17:00:00 19:00:00 then begin
  1375.               Log Starting Special Section......
  1376.            endif
  1377.         endif
  1378.  
  1379.  
  1380.   LOG <string>
  1381.  
  1382.      Writes to the screen and log file the string
  1383.  
  1384.   WRITE <string>
  1385.   ECHO <string>
  1386.  
  1387.      Write/echo string to the screen. The string is not written to the
  1388.      iFTP log file.
  1389.  
  1390.   WRITEERROR [string]
  1391.  
  1392.      Writes to the screen/log the last error number recorded
  1393.  
  1394.      example:
  1395.  
  1396.      ; Upload local files to the remote site, if any, into the
  1397.      ; remote \inbin directory
  1398.  
  1399.      open ftp.microsoft anonymous hector@santronics.com
  1400.      if not success then goto error
  1401.      if exist index.txt then get index.txt
  1402.      goto end
  1403.      Label error
  1404.      writeerror Fail to open ftp site
  1405.      Label End
  1406.  
  1407.   WEBGET <http url> [storage]
  1408.   URLGET <any url> [storage]
  1409.  
  1410.      iFTP now offers the ability to download web files using the WEBGET or
  1411.      the URLGET commands.   The difference between the two is that URLGET
  1412.      supports the standard URL naming format, while WEBGET is used for
  1413.      simply anonymous http:// web site downloads.
  1414.  
  1415.      Examples:
  1416.  
  1417.         Webget http://www.santronics.com/iftp20.zip
  1418.  
  1419.         urlget ftp://ftp.site.com/pub/whatever.zip
  1420.  
  1421.         urlget ftp://username@password:ftp.site.com/pub/whatever.zip
  1422.  
  1423.      Also URLGET can not be used under NT 3.51 in asynchronous mode.
  1424.  
  1425. ====================
  1426. Timers and Scheduler
  1427. ====================
  1428.  
  1429.   DELAY <milliseconds> [SECS|HOURS|MINS]
  1430.  
  1431.      Forces the script to pause for the amount of milliseconds defined.
  1432.  
  1433.      If no adjective is used such as secs, hours, mins then milliseconds is
  1434.      assumed.  All forms and abbreviations for the adjective is acceptable.
  1435.      i.e., hrs, mins, secs, etc.
  1436.  
  1437.      Examples:
  1438.  
  1439.      Delay 1 hour
  1440.      Delay 60 seconds
  1441.      Delay 30 minutes
  1442.  
  1443.   TIMEOUT <seconds>
  1444.  
  1445.      Creates a global timer.  If the timer expires before script is
  1446.      finished, then the script will be aborted.   This is typically not
  1447.      necessary until you have a situation where you know the script should
  1448.      finish within a known time frame but does not.
  1449.  
  1450.      Example:
  1451.  
  1452.      ;Setup global 1 hour timeout  (3600 seconds in 1 hour)
  1453.  
  1454.      Timeout 3600
  1455.  
  1456.   WAITUNTIL <hh:ss or nexthour>
  1457.  
  1458.      Creates a schedule to wait until the specific time has been
  1459.      reached. The script is paused (in idle state) while the waiting
  1460.      occurs. If the time is the special keyword "NEXTHOUR" then it will
  1461.      wait until the next hour is reached (waits 60 mins).  This is good
  1462.      for a continue script system who wished to be process every hour.
  1463.  
  1464.      The time must be in military time.
  1465.  
  1466.      Examples:
  1467.  
  1468.      ;Setup a schedule for 10:00pm
  1469.  
  1470.      WaitUntil 20:00
  1471.      if not success goto wait_aborted
  1472.  
  1473.      ;Setup a schedule for each hour
  1474.  
  1475.      WaitUntil NextHour
  1476.      if not success goto wait_aborted
  1477.  
  1478. ================================
  1479. iFTP Interactive Script Commands
  1480. ================================
  1481.  
  1482.    +----------------------------------------------------------+
  1483.    | NOTE: This feature has been removed in the iFTP v2.0     |
  1484.    | release due to Operating System incompatibility issues.  |
  1485.    | Some of it works under 95 and not under NT while other   |
  1486.    | items behave correctly on NT but not on 95.   So it has  |
  1487.    | been removed until it can be fully tested and designed   |
  1488.    | for all OSes.                                            |
  1489.    +----------------------------------------------------------+
  1490.  
  1491. iFTP has been enhanced with a new interactive keyboard script commands
  1492. which will allow you to create sophisticated interactive scripts.
  1493. Interactive scripts allow you to have a "dialog" or "conversation" with
  1494. the script to make intelligent choices.
  1495.  
  1496. The new commands are:
  1497.  
  1498.   CLS
  1499.  
  1500.      CLS is equivalent to the DOS CLS command. It clears the screen
  1501.      putting the cursor at the top of the screen.
  1502.  
  1503.   READKEY
  1504.  
  1505.      Readkey can be used two modes:
  1506.  
  1507.            - as a command to receive a character
  1508.  
  1509.            - as part of the IF condition to read a character
  1510.              and automatically compare it with another character.
  1511.  
  1512.      In either mode, Readkey waits for a single character to be
  1513.      pressed. iFTP will remembers the "last key pressed" so that it
  1514.      can checked using IF READKEY or the IF LASTKEY condition. See IF
  1515.      LASTKEY description and example.
  1516.  
  1517.   CHOICEKEY <chars> [timeout]
  1518.  
  1519.      ChoiceKey waits for a characters <chars> with an optional time out
  1520.      value. <chars> can be any single group of characters. Case
  1521.      Insensitive. To use special control characters like escape or
  1522.      carriage return, use the mnemonics provided.  See the table of
  1523.      mnemonics in the appendix.
  1524.  
  1525.      If no timeout is provided, the wait is infinite (forever). If a
  1526.      timeout is provided and the timeout is reached, the default
  1527.      character returned is the FIRST character.
  1528.  
  1529.      ChoiceKey will beep if the wrong character is hit.
  1530.  
  1531.      Examples:
  1532.  
  1533.        // wait for option Y or esc
  1534.  
  1535.        Write "Press Y to continue, ESC to abort: "
  1536.        ChoiceKey Y<esc>
  1537.  
  1538.        // Wait for option, abort if 10 secs is reached
  1539.  
  1540.        Write "Press Y to continue, ESC to abort (10 secs abort): "
  1541.        ChoiceKey <esc>Y 10 secs
  1542.  
  1543.   IF LASTKEY <char>
  1544.  
  1545.      This new if condition allows you to check the result of the readkey
  1546.      or choicekey script commands to see which key was pressed.
  1547.  
  1548.      <char> is the single character you wish to check. You can also use
  1549.      a mnemonic.  A mnemonic is a special <xx> character that represents
  1550.      a value between 0-31, often known as the ASCII control codes. See
  1551.      the appendix for the table of mnemonics recognized by iFTP.
  1552.  
  1553.      Examples:
  1554.  
  1555.        //
  1556.        // Ask user to press the ENTER key, check the last key
  1557.        // by using the mnemonic <cr>.  <cr> happens to be 13
  1558.        // so 13 can be used instead.
  1559.        //
  1560.  
  1561.        Writeln "Press ENTER to continue"
  1562.        readkey
  1563.        if not lastkey <cr> then begin
  1564.           beep
  1565.           abort "Next time hit ENTER!"
  1566.        else
  1567.           writeln "Good Boy! Let's continue"
  1568.        endif
  1569.  
  1570.        //
  1571.        // Ask for Y or N. Default to Y if no key is pressed
  1572.        // within 30 secs.
  1573.        //
  1574.  
  1575.        Write "Press N to Stop, Y to continue"
  1576.        ChoiceKey YN 30 secs
  1577.        if LastKey N then quit
  1578.  
  1579.   IF READKEY <char>
  1580.  
  1581.      This command combines the ReadKey and IF LastKey commands.
  1582.  
  1583.      Example:
  1584.  
  1585.        //
  1586.        // Using Readkey and IF Lastkey
  1587.        //
  1588.  
  1589.        ReadKey
  1590.        if lastkey <cr> then writeln Enter was hit
  1591.        if lastkey Y then writeln Y was hit
  1592.  
  1593.        //
  1594.        // Using If Readkey only
  1595.        //
  1596.  
  1597.        if ReadKey <cr> then writeln Enter was hit
  1598.        if lastkey Y then writeln Y was hit
  1599.  
  1600.        Once you use Readkey, iftp will remember the last key so you can
  1601.        only use IF LASTKEY if you wish to compare the result with other
  1602.        characters. So IF READKEY simply combines two commands into one.
  1603.  
  1604.   IF KEYPRESSED
  1605.  
  1606.      This new if condition allows you to check if a key was pressed. The
  1607.      key remains in memory until the next readkey or choicekey is
  1608.      called.  This is useful for creating loops where you might want to
  1609.      do something on a continous basis but check for an "escape"
  1610.  
  1611.      Example:
  1612.  
  1613.        Label Again:
  1614.           Call CheckForMail
  1615.           If keypressed then if readkey <esc> then exit
  1616.           goto again
  1617.  
  1618. ==============================
  1619. Using iFTP in Console Commands
  1620. ==============================
  1621.  
  1622. iFTP now offers a manual, interactive console mode.  This allows you to
  1623. to type iFTP script commands in a manual mode instantly seeing the
  1624. results.  This is useful when you want to quickly start a ftp session
  1625. and perform a few commands.
  1626.  
  1627. To start iFTP console mode, run iFTP with the /CON switch:
  1628.  
  1629.           iftp /con
  1630.  
  1631. Once in the console mode, you will be greeted with a prompt "dos:>"
  1632. where you can begin typing in commands.
  1633.  
  1634. The prompt "dos:>" has a special meaning.   Since iFTP was designed
  1635. to have script FILE I/O commands which can be used in transfer
  1636. files in either direction depending on the source and target file
  1637. names,  the dos:> signifies iFTP "frame of reference" is relatively
  1638. to the local machine current drive and directory.
  1639.  
  1640. For example, if you type "dir" at the dos:> prompt,
  1641.  
  1642.       dos:> dir
  1643.  
  1644. The dir command will assume the local drive and display files in
  1645. the current directory of the local machine.
  1646.  
  1647. However, you can switch iFTP's "frame of reference" to be relatively to
  1648. the remote ftp directory by using the FTP: command.   Once you use the
  1649. FTP: command,  the prompt will change to "ftp:>".  Now the DIR will
  1650. assume the remote drive first.
  1651.  
  1652. By using the FTP: drive switch command, it it now easy to use commands
  1653. like CD, DIR, MD, RD, etc.  For example:
  1654.  
  1655.    dos:> cd               << show local drive current directory
  1656.    dos:> ftp:             << switch to remote drive
  1657.    ftp:> cd               << show local drive current directory
  1658.    ftp:> cd usenet        << switch to the remote usenet directory
  1659.    ftp:> dir              << show files in remote usenet directory
  1660.    ftp:> dos:             << switch back to local drive
  1661.    dos:> copy *.* ftp:    << copy local files to remote current directory
  1662.  
  1663. In console mode, there are other commands available to you.  In
  1664. addition, the following are available:
  1665.  
  1666.   Help [command search]    Show help during console mode
  1667.   Rep [history index]      Repeat last or history index item
  1668.   Hist [CLEAR]             Show or clear history of commands
  1669.   Edit <file>              Call defined editor to edit file
  1670.   Status                   Show iFTP internal state information
  1671.   ftp:                     Switch to remote drive
  1672.   dos:                     switch to local drive
  1673.  
  1674. Among typical manual iFTP sessions what can be done in iFTP console
  1675. mode, another useful operation would be to create/edit scripts
  1676. within console mode so that you can quickly test them. Example:
  1677.  
  1678.   dos:> edit ftpsite.ftp    << edit or create script ftpsite.ftp
  1679.   dos:> call ftpsite        << test script
  1680.   dos:> status              << show status inforation
  1681.  
  1682. ========================================================
  1683. APPENDIX A:  iFTP Script Command Summary Reference Table
  1684. ========================================================
  1685.  
  1686.   Remote Access Service
  1687.   ---------------------
  1688.  
  1689.   DIALOPTS [/STATUS] [/KEEP] [/TIMEOUT <#>]  Define Dial Options
  1690.   DIAL [entry] [username [password]]         Dial a PPP system
  1691.   HANGUP                                     Hangup/Drop Carroer
  1692.  
  1693.   Connection, File I/O
  1694.   --------------------
  1695.  
  1696.   OPEN [host/alias] [userid] [password]      open session
  1697.   CLOSE                                      close current session
  1698.   QUIT                                       close session and quit script
  1699.   DIR [file spec]                            display directory files
  1700.   CD [directory]                             change directory
  1701.   MD <directory>                             create directory
  1702.   MKDIR <directory>                          create directory
  1703.   RD <directory>                             delete directory
  1704.   RMDIR <directory>                          delete directory
  1705.   ERASE <file(s)>                            delete file(s)
  1706.   DEL <file(s)>                              delete file(s)
  1707.   GET <remote file(s)> [storage] [-KILL]     download files
  1708.   PUT <Local file(s)> [storage]  [-KILL]     upload files
  1709.   COPY <sourceFiles> <targetpath>            copy source files to target path
  1710.   MOVE <sourceFiles> <targetpath>            move source files to target path
  1711.   RENAME <OldFileName> <NewFileName>         rename file name
  1712.   UPDATE <RemoteFiles> [DosPath] [-kill]     Copy updated remote files
  1713.   WRITEFILE <file> [string]                  write string to file
  1714.   DEBUG [ON|OFF|LOG|ASYNC|SCRIPT]            enable script debugging
  1715.   CALL <scriptfile> [parameters]             call another script
  1716.   ABORT [string]                             aborts script and exits
  1717.   HALT [errorlevel]                          aborts script w/ errorlevel
  1718.   EXIT [errorlevel]                          exist current script
  1719.   GOTO <label>                               jump to label in script
  1720.   LABEL <label>                              defines label in script
  1721.   LOG <string>                               writes string to log/screen
  1722.   LOGFILE [filename]                         change script log file
  1723.   WRITE <string>                             writes string to screen
  1724.   WRITEERROR [string]                        writes last error
  1725.   DELAY <milliseconds>                       pause/delay
  1726.   TIMEOUT <seconds>                          Create Global Timeout
  1727.   WAITUNTIL <hh:ss or NEXTHOUR>              Wait until time hh:ss or next hour
  1728.   EXEC <application>                         Spawn or start application
  1729.   DOS <dos commands or application>          Like exec, but uses COMPSEC
  1730.   STATUS                                     Show Status Information
  1731.   SET [key[=value]]                          Show/Set/UnSet local variables
  1732.   SETCLR                                     Clear all local variables
  1733.   WEBGET <http://site/filename>              Download http (WEB) only file
  1734.   URLGET <Url>                               Download generic URL file
  1735.   READFILE <filename> <var> [line#]          Read local file into variable
  1736.   LS [spec]                                  Show directory in wide format
  1737.   CACHE [ON|OFF]                             Toggle Download Cache (OFF)
  1738.   BEEP                                       Sound PC beeper
  1739.   SERVERLOG [ON:OFF]                         Log FTP responses to iftpserv.log
  1740.   BINARY [ON:OFF]                            Toggle Transfer Binary or Ascii
  1741.   ERRORQUIET [ON:OFF]                        Toggle I/O Error Display/Log
  1742.   SAVEDATE [ON:OFF]                          Use Remote Date for downloads
  1743.   PLAYWAV <wavfile>                          Play wavfile (soundcard required)
  1744.   POPUPMSG <string>                          Display window popup message
  1745.   ASYNC [ON|OFF] [ALL|CONNECT|GET|PUT|DIR]   Toggle specific async modes
  1746.   PROGRESS [ON|OFF]                          Transfer Progress Indicator
  1747.   FTP:                                       Switch to Remote FTP drive
  1748.   DOS:                                       Switch to Local DOS drive
  1749.   TYPE <file>                                Display File to Console/Screen
  1750.   XPUT <LocalFiles> [Storage] [-A -M -E -T]  Upload Files with options
  1751.   Help [command search]                      Show help during console mode
  1752.   Rep [history index]                        Repeat last or history index item
  1753.   Hist [CLEAR]                               Show or clear history of commands
  1754.   Edit <file>                                Call defined editor to edit file
  1755.   CHOICEKEY <chars> [timeout]                Keyboard Input w/ timeout
  1756.   READKEY                                    Keyboard input
  1757.   CLS                                        Clear the screen
  1758.  
  1759.   Conditional Script Processing
  1760.   -----------------------------
  1761.  
  1762.   IF [NOT] <conditions> [THEN] <commands>    conditional processing
  1763.  
  1764.   or you can use structured blocks like so:
  1765.  
  1766.   IF [NOT] <conditions> [THEN] BEGIN
  1767.       <commands>
  1768.   [ELSE]
  1769.       <commands>
  1770.       <....>
  1771.       <commands>
  1772.   ENDIF
  1773.  
  1774.   To use a structured block, the last word on the IF line must be BEGIN
  1775.   and there must be a matching ENDIF.  Nested blocks are supported. The
  1776.   only reason for structure blocks are is to eliminate the need to use
  1777.   goto statements.
  1778.  
  1779.   The conditions parameter can be any one of the following:
  1780.  
  1781.      ERRORNO <errorno>                 check last error
  1782.      SUCCESS                           check last success
  1783.      CARRIER                           check RAS carrier
  1784.      SESSION                           check current session
  1785.      ERRORLEVEL <errorlevel>           check error level
  1786.      ERRORQUIET                        true/false I/O error loggin
  1787.      EXIST <filespec>                  check remote/local file
  1788.      EQUAL <string1> <string2>         compares two strings
  1789.      LASTKEY <char>                    compares last key hit w/ char
  1790.      READKEY <char>                    read/compare a key w/ char
  1791.      KEYPRESSED                        check if key was pressed
  1792.  
  1793. ==============================================
  1794. APPENDIX B:  iFTP Ascii Control Code Mnemonics
  1795. ==============================================
  1796.  
  1797. The Ascii key code vs Mnemonics table shown below are string
  1798. representations for the first 0-31 ascii control codes.  Ascii code 32
  1799. (space) is not really a control code, but since it is difficult to
  1800. represent a "space" other than the real thing, it is given a mnemonic as
  1801. well.
  1802.  
  1803. In iFTP, mnemonics has very limited usage. Most of the mnemonics will
  1804. not be useful to you since they really only have special meaning in
  1805. certain areas which iFTP has nothing to do with (like printers).
  1806.  
  1807. However, a few do come in handy when developing interactive scripts with
  1808. keyboard script commands such as:
  1809.  
  1810.         ReadKey
  1811.         ChoiceKey
  1812.         if LastKey <char>
  1813.         if ReadKey <char>
  1814.  
  1815. For example if you wish to trap the "escape" key, then you can use
  1816. the ascii key code 27 or the mnemonic <esc>.
  1817.  
  1818. Example:
  1819.  
  1820.        ReadKey
  1821.        if LastKey <esc> then Abort "Script Aborted!"
  1822.  
  1823. or
  1824.        Write "Press Y to continue <esc> to abort: "
  1825.        ChoiceKey Y<esc>
  1826.        if LastKey 27 then Abort "Script Aborted"
  1827.  
  1828. Mnemonics like <esc>, <cr> will probably be among the most often use if
  1829. you create interactive scripts.
  1830.  
  1831.    Ascii
  1832.   Key Code    Mnemonics
  1833.   --------    ---------
  1834.  
  1835.    0          <nul>
  1836.    1          <soh>
  1837.    2          <stx>
  1838.    3          <etx>       ctrl c
  1839.    4          <eot>
  1840.    5          <enq>
  1841.    6          <ack>
  1842.    7          <bel>       bell
  1843.    8          <bs>        backspace
  1844.    9          <ht>
  1845.   10          <lf>        line feed
  1846.   11          <vt>
  1847.   12          <ff>        form feed
  1848.   13          <cr>        carriage return
  1849.   14          <so>
  1850.   15          <si>
  1851.   16          <dle>
  1852.   17          <dc1>
  1853.   18          <dc2>
  1854.   19          <dc3>
  1855.   20          <dc4>
  1856.   21          <nak>
  1857.   22          <syn>
  1858.   23          <etb>
  1859.   24          <can>
  1860.   25          <em>
  1861.   26          <sub>
  1862.   27          <esc>       escape
  1863.   28          <fs>
  1864.   29          <gs>
  1865.   30          <rs>
  1866.   31          <us>
  1867.   32          <sp>
  1868.  
  1869. ===========================================
  1870. APPENDIX C:  iFTP Diagnostics
  1871. ===========================================
  1872.  
  1873. This section offers some ideas and tools that you can use to address
  1874. potential issues and problems when dealing with the Internet and with
  1875. iFTP.
  1876.  
  1877. First, Internet Developers would like to make a small point about a
  1878. known fact when it comes to the writing software for the internet:
  1879.  
  1880.                  "Nothing is guaranteed delivery"
  1881.  
  1882. Let me explain:
  1883.  
  1884. iFTP was designed with lots of detail attention to performance and
  1885. reliability.   Performance is iFTP's responsibility.  Much of the
  1886. reliability is dependent on Microsoft's Socket Libraries offered to
  1887. software developers to write internet software.  The socket libraries
  1888. are the key to talking to the internet using what is call TCP/IP.
  1889.  
  1890. For the most part, Microsoft's Socket libraries are pretty good in the
  1891. area of reporting errors to the best of its ability.
  1892.  
  1893. If there is an internet error and this is an important concept, it has
  1894. to be a "detectable" error, the socket libraries will report them back
  1895. to the application (iFTP) and at the point, iFTP will do what it thinks
  1896. is best for the situation.
  1897.  
  1898. But once again, all developers know one thing is guaranteed with the
  1899. internet:
  1900.  
  1901.                  "Nothing is guaranteed delivery"
  1902.  
  1903. In short, what that means is if data is sent to the internet and it
  1904. has to properate thru a chain of ROUTERS to reach a destination,
  1905. you can not guarantee that it will reach the destination and you
  1906. can not quarantee you will get an "detectable error".
  1907.  
  1908. What is guaranteed by the internet is if and when data finally reaches a
  1909. destination, it guarantees that it is correct and intact.
  1910.  
  1911. So what are we talking about here?
  1912.  
  1913. We are talking about Server Availability, ISPs being down, Connection
  1914. Drops and transmission time outs.
  1915.  
  1916. The best the Socket Libraries and for the most part what the Internet
  1917. can offer are "time outs".
  1918.  
  1919. iFTP offers some tuning options to set the different timeouts so that
  1920. iFTP does not get hung in certain areas with the long default timeouts.
  1921. Some of the default times can be as long as 5 to 15 minutes.
  1922.  
  1923. The section [Wininet] in the INI file offers some key options you can
  1924. set to change the default timeouts.  The lower the value, the faster
  1925. the responses.     Keep in mind that it is very possible to get a
  1926. signficant delay when transfering a file that can be as long as 1-4
  1927. or more minutes.   But that is your judgement call based on your
  1928. particular knowledge on your specific connection points as to how
  1929. the sessions typically perform.
  1930.  
  1931. Once again, if the internet reports errors to the Windows Socket
  1932. libraries, and in turn the socket libraries report errors to iFTP,
  1933. iFTP will be able to track these errors and offer the result to
  1934. you for proper script control.
  1935.  
  1936. Here are some Win95/NT tools that are available on your machine
  1937. which you can use to perform some diagnostics:
  1938.  
  1939. Ping [address or dns name]
  1940.  
  1941.    Ping is low level internet protocol which is basically used as an
  1942.    error tool to "ping" the site to see if its alive.  Errors are based
  1943.    on "time outs" so if you ping a site, it will either time out or
  1944.    respond.  All computers on a TCP/IP network will respond to a ping
  1945.    (unless there is a firewall protecting the site).  When they receive
  1946.    a Ping, the machine is suppose to basically "echo back" the same
  1947.    information sent to it.  So if the sender does not get the
  1948.    information back within a certain "Time To Live" (TTL) value, you
  1949.    will see a Timeout error on the screen.   If the machine is
  1950.    responsing, you will see some clean information about the ping.
  1951.  
  1952.    examples:
  1953.  
  1954.          ping ftp.microsoft.com
  1955.          ping ftp2.paonline.com
  1956.          ping www.santronic.com
  1957.  
  1958. Finger [user@address] or [@address]
  1959.  
  1960.    Finger is another diagnostic tool.  Basically it is used to see
  1961.    the users "logged into a system".  But don't depend on the
  1962.    information being sent to you.  Typically what you will see,
  1963.    is the "intro" screen for a particular site.
  1964.  
  1965.    examples:
  1966.  
  1967.    finger @ftp2.paonline.com
  1968.  
  1969.        This will probably just display the ftp welcome screen. It
  1970.        depends on the ftp site.
  1971.  
  1972.    finger @ntserver
  1973.  
  1974.        If you are on a TCP/IP LAN network and the server machine
  1975.        is called ntserver, you can finger it to see if the ftp
  1976.        server can show you some information.
  1977.  
  1978.        If you are using for example, Mustang's Winserver and you have
  1979.        the FTP server enabled, Winserver will show you all users who are
  1980.        logged on, just like WCNODE will show.
  1981.  
  1982. tracert [address or dns name]
  1983.  
  1984.    Tracert is probably the best tool you have to see the routing of
  1985.    information from your computer to the final destination address.
  1986.  
  1987.    You will be surprise (and maybe even disappointed) to see how your
  1988.    information can go thru a long list of systems before it reaches the
  1989.    end point.   It all depends on how your ISP is connected to the
  1990.    internet and his higher ISP is connected to the internet, and so on
  1991.    down the line.
  1992.  
  1993.    If it seems that there is a problem somewhere in the loop, use
  1994.    tracert to see where in the loop the backlog or a broken
  1995.    connection is at.
  1996.  
  1997.    Sometimes you can blame your ISP for being down. But tracert may
  1998.    prove otherwise, it may be his provider or the next provider down the
  1999.    link.
  2000.  
  2001. You see, this is why the axiom:
  2002.  
  2003.              "Nothing is guaranteed Delivery"
  2004.  
  2005. is so true on the internet. There are so many things that can go wrong
  2006. and there is so much dependency on everyone in the loop working
  2007. properly, that you will don't have a true way to send data and make sure
  2008. the destination got it without asking him he if did get.
  2009.  
  2010. I hope this has provided some insight on the complexity of the internet
  2011. and writing software for it.
  2012.